﻿/*  @File        : QUIHelper.h
 *  @Brief       : UI通用函数类
 *  @Details     : 提供一些用于Widget界面的处理函数
 *  @Author      : HaoQinghui
 *  @Date        : 2024-05-01 23:33:56
 *  @Version     : v1.0
 *  @Copyright   : Copyright By HaoQinghui, All Rights Reserved
 *
 **********************************************************
 *
 *  @Attention   :
 *  @note 修改日志:
 *  <table>
 *  <tr><th>Date       <th>Version  <th>Author      <th>Description
 *  <tr><td>2024-05-01 <td>1.0      <td>HaoQinghui  <td>从CFormContrl文件中分离
 *  <tr><td>2024-05-28 <td>1.0      <td>HaoQinghui  <td>修改setTextFormatInt和setTextFormatDouble
 *  </table>
 *
 **********************************************************/

#ifndef QUIHELPER_H
#define QUIHELPER_H

#include <QtCore>
// **判断是否为带有GUI或控制台程序
#ifdef QT_GUI_LIB
#if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)
#include <QtWidgets>
#endif
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
#include <QtCore5Compat>
#endif
#else
#error "HQH: Not Gui! Not Widget!"
#error "Can't find gui lib. Open *.pro file add 'QT+= gui' supported"
#endif

class CWidget;
class CMainWindow;
class CDialog;
#ifdef hqh
class Q_DECL_EXPORT QUIHelper
#else
class QUIHelper
#endif
{
public:
    /**@brief 设置窗口无标题 */
    inline static void setNoTitle(QWidget *widget)
    { widget->setWindowFlags(widget->windowFlags() | Qt::FramelessWindowHint); }
    /**@brief 设置窗口状态栏无显示 */
    inline static void setNoTaskbar(QWidget *widget)
    { widget->setWindowFlags(widget->windowFlags() | Qt::Tool); }
    /**@brief 设置窗口置顶 */
    inline static void setTopMost(QWidget *widget)
    { widget->setWindowFlags(widget->windowFlags() | Qt::WindowStaysOnTopHint); }

    /**@brief 设置窗口置中(父窗体为null居中屏幕,父窗体部位null则居中父窗体) */
    static void setCenter(QWidget *widget, QWidget *widgetParent = nullptr);

    /**@brief 初始化icon图标字体 */
    static QFont getIconFont();
    /**@brief 设置icon图标字体 */
    static void setIcon(QLabel *lab, QChar ch_icon, const QFont &iconFont, quint32 size = 9)
    { setIcon(lab, LabelType, ch_icon, iconFont, size); }
    /**@brief 设置icon图标字体 */
    static void setIcon(QAbstractButton *btn, QChar ch_icon, const QFont &iconFont, quint32 size = 9)
    { setIcon(btn, ButtonType, ch_icon, iconFont, size); }

    /**@brief       : 根据颜色生成一张ICON图片
     * @details     : 根据图片大小和颜色, 生成一张ICON图片
     * @author      : HaoQinghui
     * @param       : iconSize: 图片大小
     *              : color: 颜色
     * @return      : 由color填充的ICON图片
     * @date        : 2024-04-02 14:14:18
     * @modify      : 无
     */
    static QIcon getIconColor(const QSize &iconSize, const QColor &color);

    /**@brief 设置皮肤 - 按照编号 */
    static void setSkinIndex(unsigned int qssIndex);
    /**@brief 设置皮肤 - 按照代码名 */
    static void setSkinCode(const QString &qssName);
    /**@brief 获取皮肤的代码名 */
    static QString getSkinCode(unsigned int i) {return (i < getSkinInfoList().size())?getSkinCodeList()[i]:nullptr;}
    /**@brief 获取皮肤的名字（可选多语言） */
    static QString getSkinName(unsigned int i) {return (i < getSkinInfoList().size())?getSkinNameList()[i]:nullptr;}
    /**@brief 获取可选皮肤的代码名列表 */
    static QStringList getSkinCodeList();
    /**@brief 获取可选皮肤的名字列表（可选多语言） */
    static QStringList getSkinNameList();
    /**@brief 获取可选皮肤列表 */
    static QList<std::tuple<QString, QString, QIcon> > getSkinInfoList();

    /**@brief 为控件设置输入格式错误的样式 */
    static void setCtrlErrorStyle(QWidget *widget, bool isOk);

    /**@brief 设置LineEdit只输入整数(最小值, 最大值) */
    static void setTextFormatInt(QLineEdit *text, int bottom = 0, int top = 100);
    /**@brief 设置LineEdit只输入数字(最小值, 最大值, 小数点位数) */
    static void setTextFormatDouble(QLineEdit *text, double bottom, double top, int decimals = 2);
    /**@brief 设置LineEdit为IP输入框*/
    static void setTextFormatIPAddress(QLineEdit *text);
    /**@brief 设置LineEdit只输入用户名(a-z/0-9) */
    static void setTextFormatUserName(QLineEdit *text);
    /**@brief 设置LineEdit只输入中文 */
    static void setTextFormatChineseName(QLineEdit *text);
    /**@brief 检查QLineEdit控件输入的合法性
     * @param   lineEdit 输入项(注:对被检查控件的objectName有要求)
     * @param   isClear 如果不合法,是否要清空对象
     * @return
     */
    static bool checkTextFormat(QLineEdit *lineEdit, QString &errString, bool isClear = false);
    /**@brief   检查QLineEdit控件输入的合法性
     * @param   lineEdit 输入项
     *          isClear 如果不合法,是否要清空对象
     * @return
     */
    static bool checkTextIsNum(QLineEdit *lineEdit, QString &errString, bool isClear = false);

    /**@brief   设置TableWidget的外观
     * @param   tableWidget: 输入项
     *          rowHeader: 行标题
     * @return
     */
    static void initTableWidget(QTableWidget *tableWidget, const QStringList &rowHeader = QStringList());

private:
    enum IconCtrlType {LabelType, ButtonType};

    static void setIcon(QWidget *widget, IconCtrlType ctrlType, QChar ch_icon, const QFont &iconFont, quint32 size);

};

#endif // QUIHELPER_H
